package com.westvalley.common.kit;

import java.math.BigDecimal;

@SuppressWarnings("unchecked")
public class CastKit {
	
	/**
	 * 类型转换
	 * @param <T>
	 * @param clazz
	 * @param o
	 * @return
	 */
	public static <T> T cast(Class<T> clazz,Object o){
		if( isBaseType(clazz) )
			return castBaseType(clazz,o);
		else if( isDateType(clazz) )
			return castDateType(clazz, o);
		else
			return clazz.cast(o);
	}
	
	/**
	 * 转换基础数据类型
	 * @param <T>
	 * @param clazz
	 * @param o
	 * @return
	 */
	public static <T> T castBaseType(Class<T> clazz,Object o){
		T t = null;
		if( clazz!=null && o!=null )
			t = castBaseType(clazz,o.toString());
		return t;
	}
	
	/**
	 * 转换基础数据类型
	 * @param <T>
	 * @param clazz
	 * @param o
	 * @return
	 */
	public static <T> T castBaseType(Class<T> clazz,String o){
		T t = null;
		if( clazz!=null && o!=null && !"".equals(o) ){
			Object obj = null;
			String value = o.toString();
			if( String.class.equals(clazz) ) 
				obj = new String(value);
			else if( int.class.equals(clazz) || Integer.class.equals(clazz) ) 
				obj = Integer.parseInt(value);
			else if( double.class.equals(clazz) || Double.class.equals(clazz) ) 
				obj = Double.parseDouble(value);
			else if( char.class.equals(clazz) || Character.class.equals(clazz) ) 
				obj = value.charAt(0);
			else if( BigDecimal.class.equals(clazz))
				obj = new BigDecimal(value);
			t = (T) obj;
		}
		return t;
	}
	
	/**
	 * 日期类型数据转换
	 * @param <T>
	 * @param clazz
	 * @param o
	 * @return
	 */
	public static <T> T castDateType(Class<T> clazz,Object o){
		T t = null;
		if( clazz!=null && o!=null )
			t = castDateType(clazz,o.toString());
		return t;
	}
	
	/**
	 * 日期类型数据转换
	 * @param <T>
	 * @param clazz
	 * @param o
	 * @return
	 */
	public static <T> T castDateType(Class<T> clazz,String o){
		T t = null;
		if( clazz!=null && o!=null && !"".equals(o) ){
			Object obj = null;
			if(java.util.Date.class.equals(clazz))
				obj = DateKit.getDate(o);
			if(java.sql.Date.class.equals(clazz))
				obj = DateKit.getSqlDate(o);
			if(java.sql.Time.class.equals(clazz))
				obj = DateKit.getTime(o);
			if(java.sql.Timestamp.class.equals(clazz))
				obj = DateKit.getTimestamp(o);
			t = (T) obj;
		}
		return t;
	}
 
	
	/**
	 * 是否为基础数据类型
	 * @param clazz
	 * @return
	 */
	public static boolean isBaseType(Class<?> clazz){
		if( clazz!=null ){
			if( String.class.equals(clazz) ) 
				return true;
			else if( Integer.class.equals(clazz) ) 
				return true;
			else if( int.class.equals(clazz) ) 
				return true;
			else if( Double.class.equals(clazz) ) 
				return true;
			else if( double.class.equals(clazz) ) 
				return true;
			else if( Character.class.equals(clazz) ) 
				return true;
			else if( char.class.equals(clazz) ) 
				return true;
			else if( BigDecimal.class.equals(clazz))
				return true;
		}
		return false;
	}
	
	/**
	 * 是否为日期数据类型
	 * @param clazz
	 * @return
	 */
	public static boolean isDateType(Class<?> clazz){
		if( clazz!=null ){
			if(java.util.Date.class.equals(clazz))
				return true;
			if(java.util.Timer.class.equals(clazz))
				return true;
			if(java.sql.Date.class.equals(clazz))
				return true;
			if(java.sql.Time.class.equals(clazz))
				return true;
			if(java.sql.Timestamp.class.equals(clazz))
				return true;
		}
		return false;
	}
}
